package com.loopeer.cardstack; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.view.animation.AccelerateDecelerateInterpolator; public abstract class AnimatorAdapter { static final int ANIMATION_DURATION = 400; protected CardStackView mCardStackView; protected AnimatorSet mSet; public AnimatorAdapter(CardStackView cardStackView) { mCardStackView = cardStackView; } protected void initAnimatorSet() { mSet = new AnimatorSet(); mSet.setInterpolator(new AccelerateDecelerateInterpolator()); mSet.setDuration(getDuration()); } public void itemClick(final CardStackView.ViewHolder viewHolder, int position) { if (mSet != null && mSet.isRunning()) return; initAnimatorSet(); if (mCardStackView.getSelectPosition() == position) { onItemCollapse(viewHolder); } else { onItemExpand(viewHolder, position); } if (mCardStackView.getChildCount() == 1) mSet.end(); } protected abstract void itemExpandAnimatorSet(CardStackView.ViewHolder viewHolder, int position); protected abstract void itemCollapseAnimatorSet(CardStackView.ViewHolder viewHolder); private void onItemExpand(final CardStackView.ViewHolder viewHolder, int position) { final int preSelectPosition = mCardStackView.getSelectPosition(); final CardStackView.ViewHolder preSelectViewHolder = mCardStackView.getViewHolder(preSelectPosition); if (preSelectViewHolder != null) { preSelectViewHolder.onItemExpand(false); } mCardStackView.setSelectPosition(position); itemExpandAnimatorSet(viewHolder, position); mSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); mCardStackView.setScrollEnable(false); if (preSelectViewHolder != null) { preSelectViewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_START, false); } viewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_START, true); } @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); viewHolder.onItemExpand(true); if (preSelectViewHolder != null) { preSelectViewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_END, false); } viewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_END, true); } @Override public void onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); if (preSelectViewHolder != null) { preSelectViewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_CANCEL, false); } viewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_CANCEL, true); } }); mSet.start(); } private void onItemCollapse(final CardStackView.ViewHolder viewHolder) { itemCollapseAnimatorSet(viewHolder); mSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); viewHolder.onItemExpand(false); mCardStackView.setScrollEnable(true); viewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_START, false); } @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mCardStackView.setSelectPosition(CardStackView.DEFAULT_SELECT_POSITION); viewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_END, false); } @Override public void onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); viewHolder.onAnimationStateChange(CardStackView.ANIMATION_STATE_CANCEL, false); } }); mSet.start(); } protected int getCollapseStartTop(int collapseShowItemCount) { return mCardStackView.getOverlapGapsCollapse() * (mCardStackView.getNumBottomShow() - collapseShowItemCount - (mCardStackView.getNumBottomShow() - (mCardStackView.getChildCount() - mCardStackView.getSelectPosition() > mCardStackView.getNumBottomShow() ? mCardStackView.getNumBottomShow() : mCardStackView.getChildCount() - mCardStackView.getSelectPosition() - 1))); } public int getDuration() { return mCardStackView.getDuration(); } }